# importing our data
data = data.import()
Read 5 items
Read 3 items
Read 3 items
Read 5 items
Read 3 items
Read 3 items
Read 4 items
Read 4 items
Read 18 items
Read 6 items
Read 8 items
Read 6 items
Read 18 items
Read 6 items
Read 8 items
Read 6 items
Read 18 items
Read 6 items
Read 8 items
Read 6 items
Read 9 items
Read 3 items
Read 2 items
Read 6 items
Read 13 items
Read 4 items
Read 7 items
Read 4 items
Read 3 items
Read 2 items
Read 2 items
the condition has length > 1 and only the first element will be used
head(data)

Overview

summary(data)
    dtPosix                          dt                                      dt_iso        city_id             temp          temp_min        temp_max    
 Min.   :2017-01-01 00:00:00   Min.   :1.483e+09   2017-03-18 06:00:00 +0000 UTC:   3   Min.   :2950159   Min.   :263.1   Min.   :261.1   Min.   :263.7  
 1st Qu.:2017-04-01 10:45:00   1st Qu.:1.491e+09   2017-03-30 01:00:00 +0000 UTC:   3   1st Qu.:2950159   1st Qu.:277.1   1st Qu.:277.1   1st Qu.:277.4  
 Median :2017-07-03 15:30:00   Median :1.499e+09   2017-03-30 02:00:00 +0000 UTC:   3   Median :2950159   Median :283.1   Median :283.1   Median :283.1  
 Mean   :2017-07-03 03:05:03   Mean   :1.499e+09   2017-03-30 03:00:00 +0000 UTC:   3   Mean   :2950159   Mean   :283.4   Mean   :283.0   Mean   :283.7  
 3rd Qu.:2017-10-04 02:15:00   3rd Qu.:1.507e+09   2017-03-30 04:00:00 +0000 UTC:   3   3rd Qu.:2950159   3rd Qu.:289.1   3rd Qu.:289.1   3rd Qu.:289.1  
 Max.   :2017-12-31 23:00:00   Max.   :1.515e+09   (Other)                      :9104   Max.   :2950159   Max.   :305.1   Max.   :305.1   Max.   :305.1  
                               NA's   :37          NA's                         :  37   NA's   :37        NA's   :37      NA's   :37      NA's   :37     
    pressure       humidity        wind_speed       wind_deg        rain_3h        clouds_all       weather_id     weather_main        weather_description
 Min.   : 980   Min.   : 14.00   Min.   : 0.00   Min.   :  0.0   Min.   :0.118   Min.   :  0.00   Min.   :200.0   Clouds :3434   Sky is Clear    :2972    
 1st Qu.:1010   1st Qu.: 67.00   1st Qu.: 2.00   1st Qu.:120.0   1st Qu.:0.150   1st Qu.:  0.00   1st Qu.:701.0   Clear  :2973   broken clouds   :2380    
 Median :1016   Median : 81.00   Median : 3.00   Median :230.0   Median :0.380   Median : 75.00   Median :800.0   Rain   :1195   light rain      : 803    
 Mean   :1015   Mean   : 77.17   Mean   : 3.43   Mean   :197.5   Mean   :0.672   Mean   : 45.13   Mean   :728.3   Mist   : 598   mist            : 598    
 3rd Qu.:1021   3rd Qu.: 93.00   3rd Qu.: 5.00   3rd Qu.:270.0   3rd Qu.:0.889   3rd Qu.: 75.00   3rd Qu.:803.0   Fog    : 383   scattered clouds: 536    
 Max.   :1043   Max.   :100.00   Max.   :14.00   Max.   :360.0   Max.   :9.865   Max.   :100.00   Max.   :804.0   (Other): 536   (Other)         :1830    
 NA's   :37     NA's   :37       NA's   :37      NA's   :37      NA's   :9066    NA's   :37       NA's   :37      NA's   :  37   NA's            :  37    
  weather_icon      temp.c        temp.c.group       weekday         hours         chb.all       chb.background    chb.traffic       cht.all      
 01n    :1593   Min.   :-10.02   Min.   :-10.00   sun    :1331   4      : 392   Min.   :0.2000   Min.   :0.1000   Min.   :0.200   Min.   : 0.000  
 04d    :1390   1st Qu.:  4.00   1st Qu.:  5.00   wed    :1316   6      : 392   1st Qu.:0.6667   1st Qu.:0.5000   1st Qu.:0.750   1st Qu.: 1.333  
 01d    :1379   Median : 10.00   Median : 11.00   fri    :1314   1      : 391   Median :0.9333   Median :0.7000   Median :1.050   Median : 2.000  
 04n    :1171   Mean   : 10.21   Mean   : 10.24   thu    :1303   3      : 390   Mean   :1.1730   Mean   :0.9167   Mean   :1.303   Mean   : 2.483  
 50n    : 673   3rd Qu.: 16.00   3rd Qu.: 17.00   tue    :1290   2      : 389   3rd Qu.:1.3667   3rd Qu.:1.1000   3rd Qu.:1.550   3rd Qu.: 3.000  
 (Other):2913   Max.   : 32.00   Max.   : 32.00   (Other):2565   (Other):7165   Max.   :8.9000   Max.   :9.8000   Max.   :9.400   Max.   :19.667  
 NA's   :  37   NA's   :37       NA's   :1647     NA's   :  37   NA's   :  37   NA's   :1        NA's   :162      NA's   :9       NA's   :1       
 cht.background   cht.traffic         co.all         co.traffic        no2.all        no2.background    no2.traffic       no2.suburb        no.all        
 Min.   : 0.00   Min.   : 0.000   Min.   :0.1000   Min.   :0.1000   Min.   :  3.929   Min.   :  4.00   Min.   :  4.00   Min.   : 1.20   Min.   :  0.4375  
 1st Qu.: 1.00   1st Qu.: 1.500   1st Qu.:0.2667   1st Qu.:0.2667   1st Qu.: 19.750   1st Qu.: 15.40   1st Qu.: 31.00   1st Qu.: 6.60   1st Qu.:  6.4375  
 Median : 1.00   Median : 2.500   Median :0.3500   Median :0.3500   Median : 27.625   Median : 22.40   Median : 44.83   Median :10.80   Median : 13.0000  
 Mean   : 1.81   Mean   : 2.819   Mean   :0.3867   Mean   :0.3867   Mean   : 29.279   Mean   : 25.35   Mean   : 45.88   Mean   :12.94   Mean   : 17.8855  
 3rd Qu.: 2.00   3rd Qu.: 3.500   3rd Qu.:0.4500   3rd Qu.:0.4500   3rd Qu.: 36.806   3rd Qu.: 32.60   3rd Qu.: 58.33   3rd Qu.:17.00   3rd Qu.: 23.0000  
 Max.   :24.00   Max.   :18.500   Max.   :2.2500   Max.   :2.2500   Max.   :144.062   Max.   :171.40   Max.   :187.67   Max.   :66.40   Max.   :273.3125  
 NA's   :161     NA's   :4        NA's   :1        NA's   :1        NA's   :1         NA's   :1        NA's   :1        NA's   :1       NA's   :1         
 no.background       no.traffic        no.suburb         nox.all       nox.background    nox.traffic        nox.suburb         o3.all      
 Min.   :  0.000   Min.   :  1.167   Min.   : 0.000   Min.   :  6.00   Min.   :  5.20   Min.   :  7.833   Min.   :  1.60   Min.   :  0.50  
 1st Qu.:  1.250   1st Qu.: 15.333   1st Qu.: 0.200   1st Qu.: 30.69   1st Qu.: 18.20   1st Qu.: 55.333   1st Qu.:  7.00   1st Qu.: 24.17  
 Median :  2.800   Median : 31.143   Median : 0.400   Median : 48.27   Median : 27.00   Median : 94.000   Median : 11.60   Median : 42.50  
 Mean   :  6.473   Mean   : 40.297   Mean   : 1.783   Mean   : 56.59   Mean   : 35.22   Mean   :107.422   Mean   : 15.66   Mean   : 44.07  
 3rd Qu.:  6.000   3rd Qu.: 53.500   3rd Qu.: 1.200   3rd Qu.: 71.00   3rd Qu.: 41.60   3rd Qu.:140.333   3rd Qu.: 19.25   3rd Qu.: 60.67  
 Max.   :361.800   Max.   :419.667   Max.   :90.000   Max.   :561.44   Max.   :723.80   Max.   :828.500   Max.   :189.20   Max.   :142.67  
 NA's   :1         NA's   :1         NA's   :1        NA's   :1        NA's   :1        NA's   :1         NA's   :1        NA's   :1       
 o3.background      o3.traffic     o3.suburb         pm10.all      pm10.background    pm10.traffic     pm10.suburb        so2.all        so2.background  
 Min.   :  0.00   Min.   : 1.0   Min.   :  0.25   Min.   :  4.00   Min.   :  3.333   Min.   :  5.00   Min.   :  3.00   Min.   :  0.000   Min.   : 0.000  
 1st Qu.: 20.00   1st Qu.:11.0   1st Qu.: 25.62   1st Qu.: 13.91   1st Qu.: 12.667   1st Qu.: 16.80   1st Qu.: 10.00   1st Qu.:  0.500   1st Qu.: 0.000  
 Median : 38.50   Median :25.0   Median : 45.00   Median : 18.82   Median : 17.667   Median : 22.40   Median : 14.00   Median :  1.000   Median : 1.000  
 Mean   : 40.46   Mean   :24.3   Mean   : 45.94   Mean   : 22.70   Mean   : 21.351   Mean   : 26.68   Mean   : 17.29   Mean   :  1.522   Mean   : 1.198  
 3rd Qu.: 57.50   3rd Qu.:35.0   3rd Qu.: 63.00   3rd Qu.: 27.70   3rd Qu.: 26.333   3rd Qu.: 32.20   3rd Qu.: 21.33   3rd Qu.:  1.500   3rd Qu.: 1.000  
 Max.   :138.00   Max.   :72.0   Max.   :145.00   Max.   :283.73   Max.   :211.667   Max.   :465.40   Max.   :106.33   Max.   :356.000   Max.   :27.000  
 NA's   :2        NA's   :8469   NA's   :1        NA's   :1        NA's   :1         NA's   :1        NA's   :1        NA's   :4         NA's   :27      
  so2.traffic      wind.deg.name     
 Min.   :  0.000   Length:9156       
 1st Qu.:  1.000   Class :character  
 Median :  1.000   Mode  :character  
 Mean   :  1.844                     
 3rd Qu.:  2.000                     
 Max.   :699.000                     
 NA's   :54                          

pm10 over the year

pollutant = c("pm10.background", "pm10.traffic", "pm10.suburb")
plot.pollutant(data, pollutant, month = "01", day = "01", title = "1. January with silvester firework peak")

  
plot.pollutant(data, pollutant, month = "01", yMax = 150)

plot.pollutant(data, pollutant, month = "02")

plot.pollutant(data, pollutant, month = "03")

plot.pollutant(data, pollutant, month = "04")

plot.pollutant(data, pollutant, month = "05")

plot.pollutant(data, pollutant, month = "06")

plot.pollutant(data, pollutant, month = "07")

plot.pollutant(data, pollutant, month = "08")

plot.pollutant(data, pollutant, month = "09")

plot.pollutant(data, pollutant, month = "10")

plot.pollutant(data, pollutant, month = "11")

plot.pollutant(data, pollutant, month = "12")

chb over the year

pollutant = c("chb.background", "chb.traffic")
plot.pollutant(data, pollutant, month = "01", day = "01", title = "1. January with silvester firework peak")

  
plot.pollutant(data, pollutant, month = "01")

plot.pollutant(data, pollutant, month = "02")

plot.pollutant(data, pollutant, month = "03")

plot.pollutant(data, pollutant, month = "04")

plot.pollutant(data, pollutant, month = "05")

plot.pollutant(data, pollutant, month = "06")

plot.pollutant(data, pollutant, month = "07")

plot.pollutant(data, pollutant, month = "08")

plot.pollutant(data, pollutant, month = "09")

plot.pollutant(data, pollutant, month = "10")

plot.pollutant(data, pollutant, month = "11")

plot.pollutant(data, pollutant, month = "12")

CHT over the year

pollutant = c("cht.background", "cht.traffic")
  
plot.pollutant(data, pollutant, month = "01")

plot.pollutant(data, pollutant, month = "02")

plot.pollutant(data, pollutant, month = "03")

plot.pollutant(data, pollutant, month = "04")

plot.pollutant(data, pollutant, month = "05")

plot.pollutant(data, pollutant, month = "06")

plot.pollutant(data, pollutant, month = "07")

plot.pollutant(data, pollutant, month = "08")

plot.pollutant(data, pollutant, month = "09")

plot.pollutant(data, pollutant, month = "10")

plot.pollutant(data, pollutant, month = "11")

plot.pollutant(data, pollutant, month = "12")

CO over the year

# there are only traffic sensors for co
pollutant = c("co.traffic")
plot.pollutant(data, pollutant, month = "01", day = "01", title = "1. January with silvester firework peak")

  
plot.pollutant(data, pollutant, month = "01")

plot.pollutant(data, pollutant, month = "02")

plot.pollutant(data, pollutant, month = "03")

plot.pollutant(data, pollutant, month = "04")

plot.pollutant(data, pollutant, month = "05")

plot.pollutant(data, pollutant, month = "06")

plot.pollutant(data, pollutant, month = "07")

plot.pollutant(data, pollutant, month = "08")

plot.pollutant(data, pollutant, month = "09")

plot.pollutant(data, pollutant, month = "10")

plot.pollutant(data, pollutant, month = "11")

plot.pollutant(data, pollutant, month = "12")

5. no2 over the year

pollutant = c("no2.background", "no2.traffic")
plot.pollutant(data, pollutant, month = "01", day = "01", title = "1. January with silvester firework peak")

  
plot.pollutant(data, pollutant, month = "01")

plot.pollutant(data, pollutant, month = "02")

plot.pollutant(data, pollutant, month = "03")

plot.pollutant(data, pollutant, month = "04")

plot.pollutant(data, pollutant, month = "05")

plot.pollutant(data, pollutant, month = "06")

plot.pollutant(data, pollutant, month = "07")

plot.pollutant(data, pollutant, month = "08")

plot.pollutant(data, pollutant, month = "09")

plot.pollutant(data, pollutant, month = "10")

plot.pollutant(data, pollutant, month = "11")

plot.pollutant(data, pollutant, month = "12")

6. O3 over the year

pollutant = c("o3.background", "o3.traffic", "o3.suburb")
  
plot.pollutant(data, pollutant, month = "01")

plot.pollutant(data, pollutant, month = "02")

plot.pollutant(data, pollutant, month = "03")

plot.pollutant(data, pollutant, month = "04")

plot.pollutant(data, pollutant, month = "05")

plot.pollutant(data, pollutant, month = "06")

plot.pollutant(data, pollutant, month = "07")

plot.pollutant(data, pollutant, month = "08")

plot.pollutant(data, pollutant, month = "09")

plot.pollutant(data, pollutant, month = "10")

plot.pollutant(data, pollutant, month = "11")

plot.pollutant(data, pollutant, month = "12")

so2 over the year

pollutant = c("so2.background", "so2.traffic")
plot.pollutant(data, pollutant, month = "01", day = "01", title = "1. January with silvester firework peak", yMax = 15)

  
plot.pollutant(data, pollutant, month = "01", yMax = 15)

plot.pollutant(data, pollutant, month = "02")

plot.pollutant(data, pollutant, month = "03")

plot.pollutant(data, pollutant, month = "04")

plot.pollutant(data, pollutant, month = "05")

plot.pollutant(data, pollutant, month = "06")

plot.pollutant(data, pollutant, month = "07")

plot.pollutant(data, pollutant, month = "08")

plot.pollutant(data, pollutant, month = "09")

plot.pollutant(data, pollutant, month = "10")

plot.pollutant(data, pollutant, month = "11")

plot.pollutant(data, pollutant, month = "12")

wind correlation

ggplot(data, aes(wind.deg.name,wind_speed, group = wind.deg.name)) + geom_boxplot() + ylim(0, 15) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind_speed,pm10.all, group = wind_speed)) + geom_boxplot() + ylim(0, 70) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind_speed,co.traffic, group = wind_speed)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind_speed,no2.all, group = wind_speed)) + geom_boxplot()  + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind_speed,so2.all, group = wind_speed)) + geom_boxplot()  + ylim(0, 5)  + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind_speed,o3.all, group = wind_speed)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind_speed,chb.all, group = wind_speed)) + geom_boxplot()  + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind_speed,cht.all, group = wind_speed)) + geom_boxplot()  + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind.deg.name,pm10.all, group = wind.deg.name)) + geom_boxplot() + ylim(0, 70) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind.deg.name,co.traffic, group = wind.deg.name)) + geom_boxplot()  + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind.deg.name,no2.all, group = wind.deg.name)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind.deg.name,so2.all, group = wind.deg.name)) + geom_boxplot()  + ylim(0, 5) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind.deg.name,o3.all, group = wind.deg.name)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind.deg.name,chb.all, group = wind.deg.name)) + geom_boxplot()  + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(wind.deg.name,cht.all, group = wind.deg.name)) + geom_boxplot()  + stat_summary(fun.y=mean, colour="darkred", geom="point")

temp correlation

ggplot(data, aes(temp.c.group, pm10.all, group = temp.c.group)) + geom_boxplot() + ylim(0, 15) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(temp.c.group, co.traffic, group = temp.c.group)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(temp.c.group, no2.all, group = temp.c.group)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(temp.c.group, so2.all, group = temp.c.group)) + geom_boxplot()  + ylim(0, 5) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(temp.c.group, o3.all, group = temp.c.group)) + geom_boxplot()  + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(temp.c.group, chb.all, group = temp.c.group)) + geom_boxplot()  + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(temp.c.group, cht.all, group = temp.c.group)) + geom_boxplot()  + stat_summary(fun.y=mean, colour="darkred", geom="point")

weather main correlation

ggplot(data, aes(weather_main, pm10.all, group = weather_main)) + geom_boxplot() + ylim(0, 70) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(weather_main, co.traffic, group = weather_main)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(weather_main, no2.all, group = weather_main)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(weather_main, so2.all, group = weather_main)) + geom_boxplot()  + ylim(0, 5) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(weather_main, o3.all, group = weather_main)) + geom_boxplot()  + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(weather_main, chb.all, group = weather_main)) + geom_boxplot()  + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(weather_main, cht.all, group = weather_main)) + geom_boxplot()  + stat_summary(fun.y=mean, colour="darkred", geom="point")

pressure correlation

ggplot(data, aes(pressure, pm10.all, group = pressure)) + geom_boxplot() + ylim(0, 70) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(pressure, co.traffic, group = pressure)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(pressure, no2.all, group = pressure)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(pressure, so2.all, group = pressure)) + geom_boxplot()  + ylim(0, 5) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(pressure, o3.all, group = pressure)) + geom_boxplot()  + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(pressure, chb.all, group = pressure)) + geom_boxplot()  + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(pressure, cht.all, group = pressure)) + geom_boxplot()  + stat_summary(fun.y=mean, colour="darkred", geom="point")

humidity correlation

ggplot(data, aes(humidity, pm10.all, group = humidity)) + geom_boxplot() + ylim(0, 70) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(humidity, co.traffic, group = humidity)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(humidity, no2.all, group = humidity)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(humidity, so2.all, group = humidity)) + geom_boxplot()  + ylim(0, 5) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(humidity, o3.all, group = humidity)) + geom_boxplot()  + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(humidity, chb.all, group = humidity)) + geom_boxplot()  + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(humidity, cht.all, group = humidity)) + geom_boxplot()  + stat_summary(fun.y=mean, colour="darkred", geom="point")

clouds correlation

ggplot(data, aes(clouds_all, pm10.all, group = clouds_all)) + geom_boxplot() + ylim(0, 70) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(clouds_all, co.traffic, group = clouds_all)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(clouds_all, no2.all, group = clouds_all)) + geom_boxplot() + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(clouds_all, so2.all, group = clouds_all)) + geom_boxplot()  + ylim(0, 5) + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(clouds_all, o3.all, group = clouds_all)) + geom_boxplot()  + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(clouds_all, chb.all, group = clouds_all)) + geom_boxplot()  + stat_summary(fun.y=mean, colour="darkred", geom="point")

ggplot(data, aes(clouds_all, cht.all, group = clouds_all)) + geom_boxplot()  + stat_summary(fun.y=mean, colour="darkred", geom="point")

pollutant to pollutant correlations

LS0tCnRpdGxlOiAiRGF0YSBFeHBsb3JhdGlvbiBvZiBwb2xsdXRhbnRzIHBsdXMgd2VhdGhlciBpbiBCZXJsaW4iCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAotLS0KCmBgYHtyIHNldHVwLCBlY2hvPUZBTFNFfQpzb3VyY2UoIi4vZGF0YUltcG9ydC5SIikKbGlicmFyeShsYXR0aWNlKQpyZXF1aXJlKGdncGxvdDIpCnJlcXVpcmUocmVzaGFwZTIpCnJlcXVpcmUocGx5cikKCnBsb3QucG9sbHV0YW50ID0gZnVuY3Rpb24oZGF0YSwgcG9sbHV0YW50cywgbW9udGg9IjAwIiwgZGF5PSIwMCIsIHRpdGxlPSIiLCB5TWF4PTApIHsKICBkZiA9IGRhdGFbYygiZHRQb3NpeCIsIHBvbGx1dGFudHMpXQogIGRmID0gbWVsdChkZiwgaWQudmFycyA9ICdkdFBvc2l4JywgdmFyaWFibGUubmFtZSA9ICJwb2xsdXRhbnQiLCB2YWx1ZS5uYW1lID0gInZhbHVlIikKICAKICBpZiAoZGF5ID09ICIwMCIgJiBtb250aCAhPSAiMDAiKQogICAgZGYgPSBzdWJzZXQoZGYsIGZvcm1hdC5EYXRlKGR0UG9zaXgsICIlbSIpPT1tb250aCkKICBlbHNlIGlmIChkYXkgIT0gIjAwIiAmIG1vbnRoICE9ICIwMCIpCiAgICBkZiA9IHN1YnNldChkZiwgZm9ybWF0LkRhdGUoZHRQb3NpeCwgIiVtIik9PW1vbnRoICYgZm9ybWF0LkRhdGUoZHRQb3NpeCwgIiVkIik9PWRheSkKICAKICBwbG90IDwtIGdncGxvdChkZiwgYWVzKGR0UG9zaXgsdmFsdWUpKSArIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9IHBvbGx1dGFudCkpCgogIGlmICh5TWF4ICE9IDApIHsKICAgIHBsb3QgPC0gcGxvdCArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCB5TWF4KSkgCiAgfQogIAogICAgcGxvdCArIGdndGl0bGUodGl0bGUpCn0gIApgYGAKCgpgYGB7cn0KIyBpbXBvcnRpbmcgb3VyIGRhdGEKZGF0YSA9IGRhdGEuaW1wb3J0KCkKCmhlYWQoZGF0YSkKYGBgCgoKIyMgT3ZlcnZpZXcKYGBge3J9CnN1bW1hcnkoZGF0YSkKYGBgCgojIyBwbTEwIG92ZXIgdGhlIHllYXIKCmBgYHtyfQpwb2xsdXRhbnQgPSBjKCJwbTEwLmJhY2tncm91bmQiLCAicG0xMC50cmFmZmljIiwgInBtMTAuc3VidXJiIikKCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDEiLCBkYXkgPSAiMDEiLCB0aXRsZSA9ICIxLiBKYW51YXJ5IHdpdGggc2lsdmVzdGVyIGZpcmV3b3JrIHBlYWsiKQogIApwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjAxIiwgeU1heCA9IDE1MCkKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwMiIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDMiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA0IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwNSIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDYiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA3IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwOCIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDkiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjEwIikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIxMSIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMTIiKQpgYGAKCgojIyBjaGIgb3ZlciB0aGUgeWVhcgpgYGB7cn0KcG9sbHV0YW50ID0gYygiY2hiLmJhY2tncm91bmQiLCAiY2hiLnRyYWZmaWMiKQoKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwMSIsIGRheSA9ICIwMSIsIHRpdGxlID0gIjEuIEphbnVhcnkgd2l0aCBzaWx2ZXN0ZXIgZmlyZXdvcmsgcGVhayIpCiAgCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDEiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjAyIikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwMyIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDQiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA1IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwNiIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDciKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA4IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwOSIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMTAiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjExIikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIxMiIpCmBgYAoKIyMgQ0hUIG92ZXIgdGhlIHllYXIKYGBge3J9CnBvbGx1dGFudCA9IGMoImNodC5iYWNrZ3JvdW5kIiwgImNodC50cmFmZmljIikKICAKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwMSIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDIiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjAzIikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwNCIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDUiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA2IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwNyIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDgiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA5IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIxMCIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMTEiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjEyIikKYGBgCgojIyBDTyBvdmVyIHRoZSB5ZWFyCmBgYHtyfQojIHRoZXJlIGFyZSBvbmx5IHRyYWZmaWMgc2Vuc29ycyBmb3IgY28KcG9sbHV0YW50ID0gYygiY28udHJhZmZpYyIpCgpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjAxIiwgZGF5ID0gIjAxIiwgdGl0bGUgPSAiMS4gSmFudWFyeSB3aXRoIHNpbHZlc3RlciBmaXJld29yayBwZWFrIikKICAKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwMSIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDIiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjAzIikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwNCIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDUiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA2IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwNyIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDgiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA5IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIxMCIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMTEiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjEyIikKYGBgCgojIyA1LiBubzIgb3ZlciB0aGUgeWVhcgpgYGB7cn0KcG9sbHV0YW50ID0gYygibm8yLmJhY2tncm91bmQiLCAibm8yLnRyYWZmaWMiKQoKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwMSIsIGRheSA9ICIwMSIsIHRpdGxlID0gIjEuIEphbnVhcnkgd2l0aCBzaWx2ZXN0ZXIgZmlyZXdvcmsgcGVhayIpCiAgCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDEiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjAyIikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwMyIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDQiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA1IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwNiIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDciKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA4IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwOSIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMTAiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjExIikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIxMiIpCmBgYAoKIyMgNi4gTzMgb3ZlciB0aGUgeWVhcgpgYGB7cn0KcG9sbHV0YW50ID0gYygibzMuYmFja2dyb3VuZCIsICJvMy50cmFmZmljIiwgIm8zLnN1YnVyYiIpCiAgCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDEiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjAyIikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwMyIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDQiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA1IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwNiIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDciKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA4IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwOSIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMTAiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjExIikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIxMiIpCmBgYAoKIyMgc28yIG92ZXIgdGhlIHllYXIKYGBge3J9CnBvbGx1dGFudCA9IGMoInNvMi5iYWNrZ3JvdW5kIiwgInNvMi50cmFmZmljIikKCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDEiLCBkYXkgPSAiMDEiLCB0aXRsZSA9ICIxLiBKYW51YXJ5IHdpdGggc2lsdmVzdGVyIGZpcmV3b3JrIHBlYWsiLCB5TWF4ID0gMTUpCiAgCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDEiLCB5TWF4ID0gMTUpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDIiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjAzIikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwNCIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDUiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA2IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIwNyIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMDgiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjA5IikKcGxvdC5wb2xsdXRhbnQoZGF0YSwgcG9sbHV0YW50LCBtb250aCA9ICIxMCIpCnBsb3QucG9sbHV0YW50KGRhdGEsIHBvbGx1dGFudCwgbW9udGggPSAiMTEiKQpwbG90LnBvbGx1dGFudChkYXRhLCBwb2xsdXRhbnQsIG1vbnRoID0gIjEyIikKYGBgCgojIyB3aW5kIGNvcnJlbGF0aW9uCmBgYHtyfQoKZ2dwbG90KGRhdGEsIGFlcyh3aW5kLmRlZy5uYW1lLHdpbmRfc3BlZWQsIGdyb3VwID0gd2luZC5kZWcubmFtZSkpICsgZ2VvbV9ib3hwbG90KCkgKyB5bGltKDAsIDE1KSArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCgpnZ3Bsb3QoZGF0YSwgYWVzKHdpbmRfc3BlZWQscG0xMC5hbGwsIGdyb3VwID0gd2luZF9zcGVlZCkpICsgZ2VvbV9ib3hwbG90KCkgKyB5bGltKDAsIDcwKSArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmdncGxvdChkYXRhLCBhZXMod2luZF9zcGVlZCxjby50cmFmZmljLCBncm91cCA9IHdpbmRfc3BlZWQpKSArIGdlb21fYm94cGxvdCgpICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyh3aW5kX3NwZWVkLG5vMi5hbGwsIGdyb3VwID0gd2luZF9zcGVlZCkpICsgZ2VvbV9ib3hwbG90KCkgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyh3aW5kX3NwZWVkLHNvMi5hbGwsIGdyb3VwID0gd2luZF9zcGVlZCkpICsgZ2VvbV9ib3hwbG90KCkgICsgeWxpbSgwLCA1KSAgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKHdpbmRfc3BlZWQsbzMuYWxsLCBncm91cCA9IHdpbmRfc3BlZWQpKSArIGdlb21fYm94cGxvdCgpICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyh3aW5kX3NwZWVkLGNoYi5hbGwsIGdyb3VwID0gd2luZF9zcGVlZCkpICsgZ2VvbV9ib3hwbG90KCkgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyh3aW5kX3NwZWVkLGNodC5hbGwsIGdyb3VwID0gd2luZF9zcGVlZCkpICsgZ2VvbV9ib3hwbG90KCkgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKCmdncGxvdChkYXRhLCBhZXMod2luZC5kZWcubmFtZSxwbTEwLmFsbCwgZ3JvdXAgPSB3aW5kLmRlZy5uYW1lKSkgKyBnZW9tX2JveHBsb3QoKSArIHlsaW0oMCwgNzApICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyh3aW5kLmRlZy5uYW1lLGNvLnRyYWZmaWMsIGdyb3VwID0gd2luZC5kZWcubmFtZSkpICsgZ2VvbV9ib3hwbG90KCkgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyh3aW5kLmRlZy5uYW1lLG5vMi5hbGwsIGdyb3VwID0gd2luZC5kZWcubmFtZSkpICsgZ2VvbV9ib3hwbG90KCkgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKHdpbmQuZGVnLm5hbWUsc28yLmFsbCwgZ3JvdXAgPSB3aW5kLmRlZy5uYW1lKSkgKyBnZW9tX2JveHBsb3QoKSAgKyB5bGltKDAsIDUpICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyh3aW5kLmRlZy5uYW1lLG8zLmFsbCwgZ3JvdXAgPSB3aW5kLmRlZy5uYW1lKSkgKyBnZW9tX2JveHBsb3QoKSArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmdncGxvdChkYXRhLCBhZXMod2luZC5kZWcubmFtZSxjaGIuYWxsLCBncm91cCA9IHdpbmQuZGVnLm5hbWUpKSArIGdlb21fYm94cGxvdCgpICArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmdncGxvdChkYXRhLCBhZXMod2luZC5kZWcubmFtZSxjaHQuYWxsLCBncm91cCA9IHdpbmQuZGVnLm5hbWUpKSArIGdlb21fYm94cGxvdCgpICArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCgoKCgpgYGAKCgojIyB0ZW1wIGNvcnJlbGF0aW9uCmBgYHtyfQpnZ3Bsb3QoZGF0YSwgYWVzKHRlbXAuYy5ncm91cCwgcG0xMC5hbGwsIGdyb3VwID0gdGVtcC5jLmdyb3VwKSkgKyBnZW9tX2JveHBsb3QoKSArIHlsaW0oMCwgMTUpICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyh0ZW1wLmMuZ3JvdXAsIGNvLnRyYWZmaWMsIGdyb3VwID0gdGVtcC5jLmdyb3VwKSkgKyBnZW9tX2JveHBsb3QoKSArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmdncGxvdChkYXRhLCBhZXModGVtcC5jLmdyb3VwLCBubzIuYWxsLCBncm91cCA9IHRlbXAuYy5ncm91cCkpICsgZ2VvbV9ib3hwbG90KCkgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKHRlbXAuYy5ncm91cCwgc28yLmFsbCwgZ3JvdXAgPSB0ZW1wLmMuZ3JvdXApKSArIGdlb21fYm94cGxvdCgpICArIHlsaW0oMCwgNSkgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKHRlbXAuYy5ncm91cCwgbzMuYWxsLCBncm91cCA9IHRlbXAuYy5ncm91cCkpICsgZ2VvbV9ib3hwbG90KCkgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyh0ZW1wLmMuZ3JvdXAsIGNoYi5hbGwsIGdyb3VwID0gdGVtcC5jLmdyb3VwKSkgKyBnZW9tX2JveHBsb3QoKSAgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKHRlbXAuYy5ncm91cCwgY2h0LmFsbCwgZ3JvdXAgPSB0ZW1wLmMuZ3JvdXApKSArIGdlb21fYm94cGxvdCgpICArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmBgYAoKCiMjIHdlYXRoZXIgbWFpbiBjb3JyZWxhdGlvbgpgYGB7cn0KZ2dwbG90KGRhdGEsIGFlcyh3ZWF0aGVyX21haW4sIHBtMTAuYWxsLCBncm91cCA9IHdlYXRoZXJfbWFpbikpICsgZ2VvbV9ib3hwbG90KCkgKyB5bGltKDAsIDcwKSArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmdncGxvdChkYXRhLCBhZXMod2VhdGhlcl9tYWluLCBjby50cmFmZmljLCBncm91cCA9IHdlYXRoZXJfbWFpbikpICsgZ2VvbV9ib3hwbG90KCkgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKHdlYXRoZXJfbWFpbiwgbm8yLmFsbCwgZ3JvdXAgPSB3ZWF0aGVyX21haW4pKSArIGdlb21fYm94cGxvdCgpICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyh3ZWF0aGVyX21haW4sIHNvMi5hbGwsIGdyb3VwID0gd2VhdGhlcl9tYWluKSkgKyBnZW9tX2JveHBsb3QoKSAgKyB5bGltKDAsIDUpICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyh3ZWF0aGVyX21haW4sIG8zLmFsbCwgZ3JvdXAgPSB3ZWF0aGVyX21haW4pKSArIGdlb21fYm94cGxvdCgpICArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmdncGxvdChkYXRhLCBhZXMod2VhdGhlcl9tYWluLCBjaGIuYWxsLCBncm91cCA9IHdlYXRoZXJfbWFpbikpICsgZ2VvbV9ib3hwbG90KCkgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyh3ZWF0aGVyX21haW4sIGNodC5hbGwsIGdyb3VwID0gd2VhdGhlcl9tYWluKSkgKyBnZW9tX2JveHBsb3QoKSAgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpgYGAKCiMjIHByZXNzdXJlIGNvcnJlbGF0aW9uCmBgYHtyfQpnZ3Bsb3QoZGF0YSwgYWVzKHByZXNzdXJlLCBwbTEwLmFsbCwgZ3JvdXAgPSBwcmVzc3VyZSkpICsgZ2VvbV9ib3hwbG90KCkgKyB5bGltKDAsIDcwKSArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmdncGxvdChkYXRhLCBhZXMocHJlc3N1cmUsIGNvLnRyYWZmaWMsIGdyb3VwID0gcHJlc3N1cmUpKSArIGdlb21fYm94cGxvdCgpICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyhwcmVzc3VyZSwgbm8yLmFsbCwgZ3JvdXAgPSBwcmVzc3VyZSkpICsgZ2VvbV9ib3hwbG90KCkgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKHByZXNzdXJlLCBzbzIuYWxsLCBncm91cCA9IHByZXNzdXJlKSkgKyBnZW9tX2JveHBsb3QoKSAgKyB5bGltKDAsIDUpICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyhwcmVzc3VyZSwgbzMuYWxsLCBncm91cCA9IHByZXNzdXJlKSkgKyBnZW9tX2JveHBsb3QoKSAgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKHByZXNzdXJlLCBjaGIuYWxsLCBncm91cCA9IHByZXNzdXJlKSkgKyBnZW9tX2JveHBsb3QoKSAgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKHByZXNzdXJlLCBjaHQuYWxsLCBncm91cCA9IHByZXNzdXJlKSkgKyBnZW9tX2JveHBsb3QoKSAgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpgYGAKCiMjIGh1bWlkaXR5IGNvcnJlbGF0aW9uCgpgYGB7cn0KZ2dwbG90KGRhdGEsIGFlcyhodW1pZGl0eSwgcG0xMC5hbGwsIGdyb3VwID0gaHVtaWRpdHkpKSArIGdlb21fYm94cGxvdCgpICsgeWxpbSgwLCA3MCkgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKGh1bWlkaXR5LCBjby50cmFmZmljLCBncm91cCA9IGh1bWlkaXR5KSkgKyBnZW9tX2JveHBsb3QoKSArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmdncGxvdChkYXRhLCBhZXMoaHVtaWRpdHksIG5vMi5hbGwsIGdyb3VwID0gaHVtaWRpdHkpKSArIGdlb21fYm94cGxvdCgpICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyhodW1pZGl0eSwgc28yLmFsbCwgZ3JvdXAgPSBodW1pZGl0eSkpICsgZ2VvbV9ib3hwbG90KCkgICsgeWxpbSgwLCA1KSArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmdncGxvdChkYXRhLCBhZXMoaHVtaWRpdHksIG8zLmFsbCwgZ3JvdXAgPSBodW1pZGl0eSkpICsgZ2VvbV9ib3hwbG90KCkgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyhodW1pZGl0eSwgY2hiLmFsbCwgZ3JvdXAgPSBodW1pZGl0eSkpICsgZ2VvbV9ib3hwbG90KCkgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyhodW1pZGl0eSwgY2h0LmFsbCwgZ3JvdXAgPSBodW1pZGl0eSkpICsgZ2VvbV9ib3hwbG90KCkgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKYGBgCgojIyBjbG91ZHMgY29ycmVsYXRpb24KCmBgYHtyfQpnZ3Bsb3QoZGF0YSwgYWVzKGNsb3Vkc19hbGwsIHBtMTAuYWxsLCBncm91cCA9IGNsb3Vkc19hbGwpKSArIGdlb21fYm94cGxvdCgpICsgeWxpbSgwLCA3MCkgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKGNsb3Vkc19hbGwsIGNvLnRyYWZmaWMsIGdyb3VwID0gY2xvdWRzX2FsbCkpICsgZ2VvbV9ib3hwbG90KCkgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKGNsb3Vkc19hbGwsIG5vMi5hbGwsIGdyb3VwID0gY2xvdWRzX2FsbCkpICsgZ2VvbV9ib3hwbG90KCkgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKGNsb3Vkc19hbGwsIHNvMi5hbGwsIGdyb3VwID0gY2xvdWRzX2FsbCkpICsgZ2VvbV9ib3hwbG90KCkgICsgeWxpbSgwLCA1KSArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmdncGxvdChkYXRhLCBhZXMoY2xvdWRzX2FsbCwgbzMuYWxsLCBncm91cCA9IGNsb3Vkc19hbGwpKSArIGdlb21fYm94cGxvdCgpICArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmdncGxvdChkYXRhLCBhZXMoY2xvdWRzX2FsbCwgY2hiLmFsbCwgZ3JvdXAgPSBjbG91ZHNfYWxsKSkgKyBnZW9tX2JveHBsb3QoKSAgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKGNsb3Vkc19hbGwsIGNodC5hbGwsIGdyb3VwID0gY2xvdWRzX2FsbCkpICsgZ2VvbV9ib3hwbG90KCkgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKYGBgCgojIyBwb2xsdXRhbnQgdG8gcG9sbHV0YW50IGNvcnJlbGF0aW9ucwoKYGBge3J9CmdncGxvdChkYXRhLCBhZXMoY28udHJhZmZpYywgcG0xMC5hbGwsIGdyb3VwID0gY28udHJhZmZpYykpICsgZ2VvbV9ib3hwbG90KCkgKyB5bGltKDAsIDEwMCkgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKG5vMi5hbGwsIHBtMTAuYWxsLCBncm91cCA9IG5vMi5hbGwpKSArIGdlb21fYm94cGxvdCgpICsgeWxpbSgwLCAxMDApICsgeGxpbSgwLCAxMDApICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyhzbzIuYWxsLCBwbTEwLmFsbCwgZ3JvdXAgPSBzbzIuYWxsKSkgKyBnZW9tX2JveHBsb3QoKSArIHlsaW0oMCwgMTAwKSArIHhsaW0oMCwgMTUpICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyhvMy5hbGwsIHBtMTAuYWxsLCBncm91cCA9IG8zLmFsbCkpICsgZ2VvbV9ib3hwbG90KCkgKyB5bGltKDAsIDEwMCkgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKCgpnZ3Bsb3QoZGF0YSwgYWVzKG5vMi5hbGwsIGNvLnRyYWZmaWMsIGdyb3VwID0gbm8yLmFsbCkpICsgZ2VvbV9ib3hwbG90KCkgKyB4bGltKDAsIDEwMCkgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpnZ3Bsb3QoZGF0YSwgYWVzKHNvMi5hbGwsIGNvLnRyYWZmaWMsIGdyb3VwID0gc28yLmFsbCkpICsgZ2VvbV9ib3hwbG90KCkgKyB4bGltKDAsIDE1KSArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBjb2xvdXI9ImRhcmtyZWQiLCBnZW9tPSJwb2ludCIpCmdncGxvdChkYXRhLCBhZXMobzMuYWxsLCBjby50cmFmZmljLCBncm91cCA9IG8zLmFsbCkpICsgZ2VvbV9ib3hwbG90KCkgKyB5bGltKDAsIDEuNSkgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKCmdncGxvdChkYXRhLCBhZXMoc28yLmFsbCwgbm8yLmFsbCwgZ3JvdXAgPSBzbzIuYWxsKSkgKyBnZW9tX2JveHBsb3QoKSArIHhsaW0oMCwgMzApICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKZ2dwbG90KGRhdGEsIGFlcyhvMy5hbGwsIG5vMi5hbGwsIGdyb3VwID0gbzMuYWxsKSkgKyBnZW9tX2JveHBsb3QoKSAgICsgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGNvbG91cj0iZGFya3JlZCIsIGdlb209InBvaW50IikKCmdncGxvdChkYXRhLCBhZXMobzMuYWxsLCBzbzIuYWxsLCBncm91cCA9IG8zLmFsbCkpICsgZ2VvbV9ib3hwbG90KCkgKyB5bGltKDAsIDIwKSAgKyBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgY29sb3VyPSJkYXJrcmVkIiwgZ2VvbT0icG9pbnQiKQpgYGAKCg==